package edu.kit.los.lookup;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import com.google.gson.Gson;

import edu.kit.los.event.StandartEvent;
import edu.kit.los.event.FacebookEvent;
import edu.kit.los.lookup.Lookup;

/**
 * @author felix, bene
 * LookupKlasse für Facebook
 */
@SuppressWarnings("serial")
public class FacebookLookup extends Lookup {

		
	/**
	 * Führt ein Lookup nach einem EventPrototype durch und speichert gibt dies als FacebookEvent zurück
	 * @param id ID des zu suchenden Events
	 * @return gesuchtes Facebook-EventPrototype
	 * @throws IOException TODO Fehler muss noch behandelt werden
	 */
	public static FacebookEvent lookup_event(String id) throws IOException{
		//Lookup
		URL event_url = new URL("http://graph.facebook.com/" + id);
		String str = lookup_event_String(event_url);
		//Deserialisierung des Strings in eine Klasse
		Gson gson = new Gson();
		FacebookEvent event = gson.fromJson(str,FacebookEvent.class);
		
		return event;
	}

	// Achtung: Facebook Api spinnt bei Limit
	/**
	 * @param query
	 * @param limit
	 * @return
	 */
	public java.util.List<StandartEvent> lookup(String query, int limit) {
		//Liste der FacebookEvents
		//java.util.List<V extends EventPrototype> events = new LinkedList<V extends EventPrototype>();
		//Liste der FacebookEventIDs
		java.util.List<String> eventID = new LinkedList<String>();
		//URL für Suchanfrage
		String query_encoded = "";
		try {
			query_encoded = URLEncoder.encode(query, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String limit_encoded = "";
		try {
			limit_encoded = URLEncoder.encode(Integer.toString(limit), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String url_encoded = "http://graph.facebook.com/search?q="
				+ query_encoded + "&type=event&limit=" + limit_encoded;
		URL overview_url = null;
		try {
			overview_url = new URL(url_encoded);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		//URL overview_url = new URL("Http://www.hmööpadfaeuoqiualakjtej.se");
		//HTML-Verbindung aufbauen
		String str = "";
		try {
			str = lookup_event_String(overview_url);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Alle IDs aus der Liste auslesen
		int pos = 0;
		while (pos != -1) {
			pos = str.indexOf("\"id\":", pos);
			if (pos != -1) {
				/**
				 * eventID der Liste hinzufügen
				 * TODO Könnte man hier nicht direkt die Methode zum
				 * Lookup aufrufen und gleich die Events speichern???
				 */
				eventID.add(str.substring(pos + 6, pos + 21));
				pos++;
			}
		}

		/**
		 * Für alle Events in der Liste eventID einen Lookup durchführen
		 * und das Ergebis in einer Liste speichern.
		 */
		List<StandartEvent> eventListe = new LinkedList<StandartEvent>();
		for (String i :eventID) {
			StandartEvent event = null;
			try {
				event = new StandartEvent(lookup_event(i));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			eventListe.add(event);
		}
		//events.addAll(eventListe);
		//events.addAll(eventListe);
		return eventListe;
	}
}
